﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using Model;

namespace DAO
{
    public class PedidoDAO
    {
        private SqlConnection conexaoDB = null;
        private String stringConexao = ConfigurationManager.ConnectionStrings["ControlePedidoDB"].ToString();
        private static PedidoDAO singleton = null;
        private SqlCommand comandoExecutar = null;

        private PedidoDAO() 
        {
            conexaoDB = new SqlConnection(stringConexao);
        }

        public static PedidoDAO getInstance() 
        {
            if (singleton == null) 
            {
                singleton = new PedidoDAO();
            }

            return singleton;
        }

        public bool hasPedidos(Cliente cliente) 
        {
            bool validacao = false;
            String SQL_CONSULTA = "SELECT id_pedido FROM Pedido WHERE id_cliente = @id";
            SqlDataReader resultadosObtidos = null;

            try
            {
                conexaoDB.Open();

                comandoExecutar = new SqlCommand(SQL_CONSULTA, conexaoDB);
                comandoExecutar.Parameters.Add(new SqlParameter("@id", cliente.Codigo));

                resultadosObtidos = comandoExecutar.ExecuteReader();

                validacao = resultadosObtidos.HasRows;
            }
            catch (Exception)
            {
                throw;
            }
            finally 
            {
                conexaoDB.Close();
            }

            return validacao;
        }

        public int inserir(Pedido pedido) 
        {
            int codigoPedido = 0;
            String SQL_INSERT = "INSERT INTO Pedido (descricao, data, valor_total, valor_desconto, id_cliente, orcamento)" + 
                                    "VALUES (@descricao, @data, @valorTotal, @valorDesconto, @cliente, @orcamento)";            
            try
            {
                conexaoDB.Open();

                comandoExecutar = new SqlCommand(SQL_INSERT, conexaoDB);
                comandoExecutar.Parameters.Add(new SqlParameter("@descricao", pedido.Descricao));
                comandoExecutar.Parameters.Add(new SqlParameter("@data", pedido.Data));
                comandoExecutar.Parameters.Add(new SqlParameter("@valorTotal", pedido.ValorTotal));
                comandoExecutar.Parameters.Add(new SqlParameter("@valorDesconto", pedido.ValorDesconto));
                comandoExecutar.Parameters.Add(new SqlParameter("@cliente", pedido.Cliente.Codigo));
                comandoExecutar.Parameters.Add(new SqlParameter("@orcamento", pedido.Orcamento));

                comandoExecutar.ExecuteNonQuery();

                comandoExecutar.CommandText = "SELECT @@IDENTITY";
                codigoPedido = int.Parse(comandoExecutar.ExecuteScalar().ToString());
            }
            catch (Exception cause)
            {
                throw new Exception("Problemas ao inserir o pedido - " + cause.Message);
            }
            finally 
            {
                conexaoDB.Close();
            }

            return codigoPedido;
        }

        public Pedido consultar(Pedido pedido) {
            String SQL_CONSULTA = "SELECT descricao, data, valor_total, valor_desconto, id_cliente, orcamento FROM Pedido"
                                + " WHERE id_pedido = @id";
            SqlDataReader resultadosObtidos = null;

            try
            {
                conexaoDB.Open();

                comandoExecutar = new SqlCommand(SQL_CONSULTA, conexaoDB);
                comandoExecutar.Parameters.Add(new SqlParameter("@id", pedido.Codigo));

                resultadosObtidos = comandoExecutar.ExecuteReader();

                while (resultadosObtidos.Read()) 
                { 
                    pedido.Descricao = resultadosObtidos["descricao"].ToString();
                //    pedido.Data = FormularioUtil.getInstance().convertToDate(resultadosObtidos["data"].ToString());
                    pedido.ValorTotal = decimal.Parse(resultadosObtidos["valor_total"].ToString());
                    pedido.ValorDesconto = decimal.Parse(resultadosObtidos["valor_desconto"].ToString());
                    pedido.Cliente = new Cliente(int.Parse(resultadosObtidos["id_cliente"].ToString()));
                    pedido.Orcamento = resultadosObtidos["orcamento"].ToString();
                }
            }
            catch (Exception cause)
            {
                throw cause;
            }
            finally 
            {
                conexaoDB.Close();
            }

            return pedido;
        }

        public void deletarPedido(Pedido pedido) 
        {
            String SQL_DELETE = "DELETE FROM Pedido WHERE id_pedido = @id";

            try
            {
                conexaoDB.Open();

                comandoExecutar = new SqlCommand(SQL_DELETE, conexaoDB);
                comandoExecutar.Parameters.Add(new SqlParameter("@id", pedido.Codigo));

                comandoExecutar.ExecuteNonQuery();
            }
            catch (Exception cause) 
            {
                throw cause;
            }
            finally
            {
                conexaoDB.Close();
            }
        }
    }
}
